iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
1

其實網路上已經有很多實作調色盤的範例,網路上蒐集到的方法:

  1. 擴充 UIColor
  2. 建立新的 Class 模仿 UIColor
  3. 建立 Struct 模仿 UIColor

首先我們可以先偷窺看看 UIColor 的實作方式:

open class UIColor : NSObject, NSSecureCoding, NSCopying {
	open class var black: UIColor { get }
	open class var darkGray: UIColor { get }
	// ...
}

基本上是一個 Class 裡面有預設的系統顏色,每個系統顏色都是一個 UIColor 物件。

不過我實際測試沒辦法做到下列行為:

UIColor.black.black

實際要了解原因得去挖出 Swift 的原始碼,不過為了讓專案順利進行,先把這個衝動從腦中抹去。

回到主題,如果 UIColor 是個 Class,代表我們可以擴充 UIColor 來增加我們的顏色。

方法一:擴充 UIColor

extension UIColor {
    static var MMBlack = UIColor(red: 0x39 / 255, green: 0x3D / 255, blue: 0x3F / 255, alpha: 1)
    static var MMWhite = UIColor(red: 0xFD / 255, green: 0xFD / 255, blue: 0xFF / 255, alpha: 1)
    static var MMGreen = UIColor(red: 0x96 / 255, green: 0xE6 / 255, blue: 0xB3 / 255, alpha: 1)
    static var MMRed = UIColor(red: 0xDA / 255, green: 0x3E / 255, blue: 0x52 / 255, alpha: 1)
    static var MMBlue = UIColor(red: 0x8A / 255, green: 0xC4 / 255, blue: 0xFF / 255, alpha: 1)
}

使用方式如下:

view.backgroundColor = UIColor.MMBlue

缺點是為了避免跟 UIColor 原本的名稱衝突,所以顏色都要加上前綴 MM。

方法二:另起爐灶建立新的 Class 模仿 UIColor

class MMColor {
    static var black = UIColor(red: 0x39 / 255, green: 0x3D / 255, blue: 0x3F / 255, alpha: 1)
    static var white = UIColor(red: 0xFD / 255, green: 0xFD / 255, blue: 0xFF / 255, alpha: 1)
    static var green = UIColor(red: 0x96 / 255, green: 0xE6 / 255, blue: 0xB3 / 255, alpha: 1)
    static var red = UIColor(red: 0xDA / 255, green: 0x3E / 255, blue: 0x52 / 255, alpha: 1)
    static var blue = UIColor(red: 0x8A / 255, green: 0xC4 / 255, blue: 0xFF / 255, alpha: 1)
}
view.backgroundColor = MMColor.blue

其實做法跟方法一擴充 UIColor 是一樣的。

方法三:建立 Struct 模仿 UIColor

struct MMColor {
    static var black = UIColor(red: 0x39 / 255, green: 0x3D / 255, blue: 0x3F / 255, alpha: 1)
    static var white = UIColor(red: 0xFD / 255, green: 0xFD / 255, blue: 0xFF / 255, alpha: 1)
    static var green = UIColor(red: 0x96 / 255, green: 0xE6 / 255, blue: 0xB3 / 255, alpha: 1)
    static var red = UIColor(red: 0xDA / 255, green: 0x3E / 255, blue: 0x52 / 255, alpha: 1)
    static var blue = UIColor(red: 0x8A / 255, green: 0xC4 / 255, blue: 0xFF / 255, alpha: 1)
}
view.backgroundColor = MMColor.blue

定案:使用 Struct 實作調色盤

最終我還是決定用方法三,因為目前我還沒想到有什麼需求是需要把這些顏色定義成 Class,而且擴充 UIColor 的做法,會讓每個顏色都加上前綴,看起來不夠優雅。

最終,我們新增了一個檔案 MMColor.swift 來放調色盤的 Struct,目前目錄結構如下:

Money Mom
├── AppDelegate.swift
├── Assets.xcassets
├── Base.lproj
├── Info.plist
└── MMColor.swift <--- 主角在這

2 directories, 3 files

有了這樣一個 MMColor 的 Struct,未來我們介面需要顏色的地方,都能很輕易地使用這個 Struct 上色;如果需要調整色碼,只需要修改這個 Struct 就可以了。

目前程式碼


上一篇
Money Mom - 功能規劃、介面設計
下一篇
Money Mom - 標籤輸入
系列文
iOS 三十天上架記帳 APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言